
#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Если Параметры.Свойство("АвтоТест") Тогда
		Возврат;
	КонецЕсли;

	ПроверитьВерсиюИРежимСовместимостиПлатформы();

	РежимРаботыНаКлиенте = (РежимРаботыНаКлиентеИлиНаСервере = 0);

	Элементы.ИмяФайлаВыгрузки.Доступность = Не РежимРаботыНаКлиенте;

	ОбъектНаСервере = РеквизитФормыВЗначение("Объект");
	ОбъектНаСервере.Инициализация();

	ЗначениеВРеквизитФормы(ОбъектНаСервере.ДеревоМетаданных, "Объект.ДеревоМетаданных");

	Файл = Новый Файл(ИмяФайлаВыгрузки);
	Объект.ИспользоватьФорматFastInfoSet = (Файл.Расширение = ".fi");

	РежимВыгрузки = (Элементы.ГруппаРежим.ТекущаяСтраница = Элементы.ГруппаРежим.ПодчиненныеЭлементы.ГруппаВыгрузка);

	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);

КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)

	РежимРаботыНаКлиенте = (РежимРаботыНаКлиентеИлиНаСервере = 0);

	Элементы.ИмяФайлаВыгрузки.Доступность = Не РежимРаботыНаКлиенте;

	Файл = Новый Файл(ИмяФайлаВыгрузки);
	Объект.ИспользоватьФорматFastInfoSet = (Файл.Расширение = ".fi");

	РежимВыгрузки = (Элементы.ГруппаРежим.ТекущаяСтраница = Элементы.ГруппаРежим.ПодчиненныеЭлементы.ГруппаВыгрузка);

КонецПроцедуры

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)

	ОбработкаВыбораНаСервере(ВыбранноеЗначение);

КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

	Если ИмяСобытия = "ЗакрытаФормаНастройкиКонсолиЗапросов" Тогда
		ЗаполнитьЗначенияСвойств(ЭтотОбъект, Параметр);
	КонецЕсли;

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура ИмяФайлаВыгрузкиПриИзменении(Элемент)

	Файл = Новый Файл(ИмяФайлаВыгрузки);
	Объект.ИспользоватьФорматFastInfoSet = (Файл.Расширение = ".fi");

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаВыгрузкиОткрытие(Элемент, СтандартнаяОбработка)

	ОткрытьВПриложении(Элемент, "ИмяФайлаВыгрузки", СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура ИмяФайлаВыгрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	ОбработатьНачалоВыбораФайла(СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура ИспользоватьФорматFastInfoSetПриИзменении(Элемент)

	Если Объект.ИспользоватьФорматFastInfoSet Тогда
		ИмяФайлаВыгрузки = СтрЗаменить(ИмяФайлаВыгрузки, ".xml", ".fi");
	Иначе
		ИмяФайлаВыгрузки = СтрЗаменить(ИмяФайлаВыгрузки, ".fi", ".xml");
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ГруппаРежимПриСменеСтраницы(Элемент, ТекущаяСтраница)

	РежимВыгрузки = (Элементы.ГруппаРежим.ТекущаяСтраница = Элементы.ГруппаРежим.ПодчиненныеЭлементы.ГруппаВыгрузка);

КонецПроцедуры

&НаКлиенте
Процедура ДополнительныеОбъектыДляВыгрузкиПриИзменении(Элемент)

	Если Элемент.ТекущиеДанные <> Неопределено И ЗначениеЗаполнено(Элемент.ТекущиеДанные.Объект) Тогда

		Элемент.ТекущиеДанные.ИмяОбъектаДляЗапроса = ИмяОбъектаПоТипуДляЗапроса(Элемент.ТекущиеДанные.Объект);

	КонецЕсли;

КонецПроцедуры

//@skip-check module-unused-method
&НаКлиенте
Процедура ИмяФайлаЗагрузкиОткрытие(Элемент, СтандартнаяОбработка)

	ОткрытьВПриложении(Элемент, "ИмяФайлаЗагрузки", СтандартнаяОбработка);

КонецПроцедуры

//@skip-check module-unused-method
&НаКлиенте
Процедура ИмяФайлаЗагрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

	ОбработатьНачалоВыбораФайла(СтандартнаяОбработка);

КонецПроцедуры

&НаКлиенте
Процедура ТипОбъектовДляВыгрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	УИ_ОбщегоНазначенияКлиент.РедактироватьТип(ТипОбъектовДляВыгрузки, 0, СтандартнаяОбработка, Элемент,
		Новый ОписаниеОповещения("ТипОбъектовДляВыгрузкиНачалоВыбораЗавершение", ЭтотОбъект), "Ссылки");
КонецПроцедуры

&НаКлиенте
Процедура ТипОбъектовДляВыгрузкиНачалоВыбораЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТипОбъектовДляВыгрузки = Результат;
КонецПроцедуры


#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоМетаданных

&НаКлиенте
Процедура ДеревоМетаданныхВыгружатьПриИзменении(Элемент)

	ТекущиеДанные = Элементы.ДеревоМетаданных.ТекущиеДанные;

	Если ТекущиеДанные.Выгружать = 2 Тогда
		ТекущиеДанные.Выгружать = 0;
	КонецЕсли;

	УстановитьПометкиПодчиненных(ТекущиеДанные, "Выгружать");
	УстановитьПометкиРодителей(ТекущиеДанные, "Выгружать");

	ТекущиеДанныеИмя = Элементы.ДеревоМетаданных.ТекущиеДанные.ПолноеИмяМетаданных;

	//ТаблицаРезультатОтбор.Очистить();
	ПодготовитьСписокВыбранныхОбъектов(ТекущиеДанныеИмя, Элементы.ДеревоМетаданных.ТекущиеДанные.ИмяОбъектаМетаданных);

КонецПроцедуры

&НаКлиенте
Процедура ДеревоМетаданныхВыгружатьПриНеобходимостиПриИзменении(Элемент)

	ТекущиеДанные = Элементы.ДеревоМетаданных.ТекущиеДанные;

	Если ТекущиеДанные.ВыгружатьПриНеобходимости = 2 Тогда
		ТекущиеДанные.ВыгружатьПриНеобходимости = 0;
	КонецЕсли;

	УстановитьПометкиПодчиненных(ТекущиеДанные, "ВыгружатьПриНеобходимости");
	УстановитьПометкиРодителей(ТекущиеДанные, "ВыгружатьПриНеобходимости");

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыДополнительныеОбъектыДляВыгрузки

&НаКлиенте
Процедура ДополнительныеОбъектыДляВыгрузкиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)

	Элемент.ТекущийЭлемент.ОграничениеТипа = ТипОбъектовДляВыгрузки;

КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ДобавитьИзЗапроса(Команда)

	ОткрытьФорму(ИмяФормыКонсолиЗапросов(), ПараметрыКонсолиЗапросов(), ЭтотОбъект);

КонецПроцедуры

&НаКлиенте
Процедура ОчиститьДополнительныеОбъектыВыгрузки(Команда)

	Объект.ДополнительныеОбъектыДляВыгрузки.Очистить();

КонецПроцедуры

&НаКлиенте
Процедура ВыгрузитьДанные(Команда)

	Объект.ДатаНачала = ПериодВыгрузки.ДатаНачала;
	Объект.ДатаОкончания = ПериодВыгрузки.ДатаОкончания;

	ОчиститьСообщения();

	Если Не РежимРаботыНаКлиенте Тогда

		Если ПустаяСтрока(ИмяФайлаВыгрузки) Тогда

			ТекстСообщения = Нстр("ru = 'Поле ""Имя файла"" не заполнено'");
			СообщитьПользователю(ТекстСообщения, "ИмяФайлаВыгрузки");
			Возврат;

		КонецЕсли;

	КонецЕсли;

	Состояние(Нстр("ru = 'Выполняется выгрузка данных. Пожалуйста, подождите...'"));

	АдресФайлаВоВременномХранилище = "";
	ВыгрузитьДанныеНаСервере(АдресФайлаВоВременномХранилище);

	Если РежимРаботыНаКлиенте И Не ПустаяСтрока(АдресФайлаВоВременномХранилище) Тогда

		ИмяФайла = ?(Объект.ИспользоватьФорматFastInfoSet, Нстр("ru = 'Файл выгрузки.fi'"), Нстр(
			"ru = 'Файл выгрузки.xml'"));
		ПолучитьФайл(АдресФайлаВоВременномХранилище, ИмяФайла);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьДанные(Команда)

	ОчиститьСообщения();
	АдресФайлаВоВременномХранилище = "";

	//	Если РежимРаботыНаКлиенте Тогда

	//ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьДанныеЗавершение", ЭтотОбъект);
	//НачатьПомещениеФайлаНаСервер(ОписаниеОповещения,,,АдресФайлаВоВременномХранилище,, ЭтаФорма.УникальныйИдентификатор);
	Режим = РежимДиалогаВыбораФайла.Открытие;
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
	ДиалогОткрытияФайла.ПолноеИмяФайла = "";
	//Фильтр = НСтр("ru = 'XML файлы'; en = 'XML files'")	+ "(*.xml)|*.xml";
	//ДиалогОткрытияФайла.Фильтр = Фильтр;
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	ДиалогОткрытияФайла.Заголовок = "Выберите файлы";

	ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьДанныеЗавершение", ЭтотОбъект);
	НачатьПомещениеФайла(ОписаниеОповещения, АдресФайлаВоВременномХранилище, ДиалогОткрытияФайла, Истина,
		УникальныйИдентификатор);

КонецПроцедуры

&НаКлиенте
Процедура НастройкиКонсолиЗапросов(Команда)

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ВариантИспользованияКонсолиЗапросов", ВариантИспользованияКонсолиЗапросов);
	ПараметрыФормы.Вставить("ПутьКВнешнейКонсолиЗапросов", ПутьКВнешнейКонсолиЗапросов);

	ОткрытьФорму(ИмяФормыНастроекКонсолиЗапросов(), ПараметрыФормы);

КонецПроцедуры

&НаКлиенте
Процедура ПересчитатьВыгружаемыеПоСсылке(Команда)

	Состояние(Нстр("ru = 'Выполняется поиск объектов метаданных, которые могут быть выгружены по ссылкам...'"));
	СохранитьОтображениеДерева(Объект.ДеревоМетаданных.ПолучитьЭлементы());
	ПересчитатьВыгружаемыеПоСсылкеНаСервере();
	ВосстановитьОтображениеДерева(Объект.ДеревоМетаданных.ПолучитьЭлементы());

КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры



#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Функция ИмяФормыКонсолиЗапросов()

	Если ВариантИспользованияКонсолиЗапросов = 0 Тогда

		Обработка = РеквизитФормыВЗначение("Объект");
		ИдентификаторФормы = ".Форма.ВыборИзЗапроса";

	ИначеЕсли ВариантИспользованияКонсолиЗапросов = 1 Тогда

		Обработка = Обработки.УИ_КонсольЗапросов.Создать();
		ИдентификаторФормы = ".Форма";

	Иначе //ВариантИспользованияКонсолиЗапросов = 2
		Обработка = ВнешниеОбработки.Создать(ПутьКВнешнейКонсолиЗапросов);
		ИдентификаторФормы = ".ФормаОбъекта";

	КонецЕсли;

	Возврат Обработка.Метаданные().ПолноеИмя() + ИдентификаторФормы;

КонецФункции

&НаСервере
Функция ИмяФормыНастроекКонсолиЗапросов()

	Обработка = РеквизитФормыВЗначение("Объект");
	ИмяФормыНастроек = Обработка.Метаданные().ПолноеИмя() + ".Форма.НастройкиКонсолиЗапросов";

	Возврат ИмяФормыНастроек;

КонецФункции

&НаКлиенте
Функция ПараметрыКонсолиЗапросов()

	ПараметрыФормы = Новый Структура;

	Если ВариантИспользованияКонсолиЗапросов = 0 Тогда

		ПараметрыФормы.Вставить("ВариантИспользованияКонсолиЗапросов", ВариантИспользованияКонсолиЗапросов);
		ПараметрыФормы.Вставить("ПутьКВнешнейКонсолиЗапросов", ПутьКВнешнейКонсолиЗапросов);

	Иначе

		ПараметрыФормы.Вставить("Заголовок", НСтр("ru='Выбор данных для выгрузки'"));
		ПараметрыФормы.Вставить("РежимВыбора", Истина);
		ПараметрыФормы.Вставить("ЗакрыватьПриВыборе", Ложь);

	КонецЕсли;

	Возврат ПараметрыФормы;

КонецФункции

&НаКлиенте
Процедура ОткрытьВПриложении(Элемент, ПутьКДанным, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

	Файл = Новый Файл(Элемент.ТекстРедактирования);

	Файл.НачатьПроверкуСуществования(Новый ОписаниеОповещения("ОткрытьВПриложенииЗавершение", ЭтаФорма,
		Новый Структура("ПутьКДанным, Элемент", ПутьКДанным, Элемент)));

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьВПриложенииЗавершение(Существует, ДополнительныеПараметры) Экспорт

	ПутьКДанным = ДополнительныеПараметры.ПутьКДанным;
	Элемент = ДополнительныеПараметры.Элемент;
	Если Существует Тогда

		НачатьЗапускПриложения(УИ_ОбщегоНазначенияКлиент.ПустоеОписаниеОповещенияДляЗапускаПриложения(),
			Элемент.ТекстРедактирования);

	Иначе

		СообщитьПользователю(Нстр("ru = 'Файл не найден'"), ПутьКДанным);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПриИзмененииРежимаРаботы()

	РежимРаботыНаКлиенте = (РежимРаботыНаКлиентеИлиНаСервере = 0);

	Элементы.ИмяФайлаВыгрузки.Доступность = Не РежимРаботыНаКлиенте;
	Элементы.ИмяФайлаЗагрузки.Доступность = Не РежимРаботыНаКлиенте;

КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Процедура СообщитьПользователю(Текст, ПутьКДанным = "")

	Сообщение = Новый СообщениеПользователю;
	Сообщение.Текст = Текст;
	Сообщение.ПутьКДанным = ПутьКДанным;
	Сообщение.Сообщить();

КонецПроцедуры

&НаКлиенте
Процедура ОбработатьНачалоВыбораФайла(СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;
	РежимДиалога = ?(РежимВыгрузки, РежимДиалогаВыбораФайла.Сохранение, РежимДиалогаВыбораФайла.Открытие);
	ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалога);
	ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Не РежимВыгрузки;
	ДиалогВыбораФайла.МножественныйВыбор = Ложь;
	ДиалогВыбораФайла.Заголовок = Нстр("ru = 'Задайте имя файла выгрузки'");
	ДиалогВыбораФайла.ПолноеИмяФайла = ?(РежимВыгрузки, ИмяФайлаВыгрузки, ИмяФайлаЗагрузки);

	ДиалогВыбораФайла.Фильтр = "Формат выгрузки(*.xml)|*.xml|FastInfoSet (*.fi)|*.fi|Все файлы (*.*)|*.*";
	ДиалогВыбораФайла.Показать(Новый ОписаниеОповещения("ОбработатьНачалоВыбораФайлаЗавершение", ЭтаФорма,
		Новый Структура("ДиалогВыбораФайла", ДиалогВыбораФайла)));

КонецПроцедуры

&НаКлиенте
Процедура ОбработатьНачалоВыбораФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	ДиалогВыбораФайла = ДополнительныеПараметры.ДиалогВыбораФайла;
	Если (ВыбранныеФайлы <> Неопределено) Тогда
		Если РежимВыгрузки Тогда
			ИмяФайлаВыгрузки = ДиалогВыбораФайла.ПолноеИмяФайла;
		Иначе
			ИмяФайлаЗагрузки = ДиалогВыбораФайла.ПолноеИмяФайла;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура УстановитьПометкиПодчиненных(ТекСтрока, ИмяФлажка)

	Подчиненные = ТекСтрока.ПолучитьЭлементы();

	Если Подчиненные.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Для Каждого Строка Из Подчиненные Цикл

		Строка[ИмяФлажка] = ТекСтрока[ИмяФлажка];

		УстановитьПометкиПодчиненных(Строка, ИмяФлажка);

	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура УстановитьПометкиРодителей(ТекСтрока, ИмяФлажка)

	Родитель = ТекСтрока.ПолучитьРодителя();
	Если Родитель = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТекСостояние = Родитель[ИмяФлажка];

	НайденыВключенные = Ложь;
	НайденыВыключенные = Ложь;

	Для Каждого Строка Из Родитель.ПолучитьЭлементы() Цикл
		Если Строка[ИмяФлажка] = 0 Тогда
			НайденыВыключенные = Истина;
		ИначеЕсли Строка[ИмяФлажка] = 1 Или Строка[ИмяФлажка] = 2 Тогда
			НайденыВключенные = Истина;
		КонецЕсли;
		Если НайденыВключенные И НайденыВыключенные Тогда
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Если НайденыВключенные И НайденыВыключенные Тогда
		Включить = 2;
	ИначеЕсли НайденыВключенные И (Не НайденыВыключенные) Тогда
		Включить = 1;
	ИначеЕсли (Не НайденыВключенные) И НайденыВыключенные Тогда
		Включить = 0;
	ИначеЕсли (Не НайденыВключенные) И (Не НайденыВыключенные) Тогда
		Включить = 2;
	КонецЕсли;

	Если Включить = ТекСостояние Тогда
		Возврат;
	Иначе
		Родитель[ИмяФлажка] = Включить;
		УстановитьПометкиРодителей(Родитель, ИмяФлажка);
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ВыгрузитьДанныеНаСервере(АдресФайлаВоВременномХранилище)

	ТаблицаОтбора1 = РеквизитФормыВЗначение("ТаблицаОтбора");

	Если РежимРаботыНаКлиенте Тогда

		Расширение = ?(Объект.ИспользоватьФорматFastInfoSet, ".fi", ".xml");
		ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);

	Иначе

		ИмяВременногоФайла = ИмяФайлаВыгрузки;

	КонецЕсли;

	ОбъектНаСервере = РеквизитФормыВЗначение("Объект");
	ЗаполнитьДеревоМетаданныхНаСервере(ОбъектНаСервере);

	ОбъектНаСервере.ВыполнитьВыгрузку(ИмяВременногоФайла, , ТаблицаОтбора1);

	Если РежимРаботыНаКлиенте Тогда

		Файл = Новый Файл(ИмяВременногоФайла);

		Если Файл.Существует() Тогда

			ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
			АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
			УдалитьФайлы(ИмяВременногоФайла);

		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ПроставитьПометкиВыгружаемыхДанных(СтрокиИсходногоДерева, СтрокиЗаменяемогоДерева)

	КолонкаВыгружать = СтрокиЗаменяемогоДерева.ВыгрузитьКолонку("Выгружать");
	СтрокиИсходногоДерева.ЗагрузитьКолонку(КолонкаВыгружать, "Выгружать");

	КолонкаВыгружатьПриНеобходимости = СтрокиЗаменяемогоДерева.ВыгрузитьКолонку("ВыгружатьПриНеобходимости");
	СтрокиИсходногоДерева.ЗагрузитьКолонку(КолонкаВыгружатьПриНеобходимости, "ВыгружатьПриНеобходимости");

	КолонкаРазвернут = СтрокиЗаменяемогоДерева.ВыгрузитьКолонку("Развернут");
	СтрокиИсходногоДерева.ЗагрузитьКолонку(КолонкаРазвернут, "Развернут");

	Для Каждого СтрокаИсходногоДерева Из СтрокиИсходногоДерева Цикл

		ИндексСтроки = СтрокиИсходногоДерева.Индекс(СтрокаИсходногоДерева);
		СтрокаИзменяемогоДерева = СтрокиЗаменяемогоДерева.Получить(ИндексСтроки);

		ПроставитьПометкиВыгружаемыхДанных(СтрокаИсходногоДерева.Строки, СтрокаИзменяемогоДерева.Строки);

	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьДанныеЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
	Если Не Результат Тогда
		Возврат;
	КонецЕсли;

	Состояние(Нстр("ru = 'Выполняется загрузка данных. Пожалуйста, подождите...'"));

	ЗагрузитьДанныеНаСервере(Адрес);

КонецПроцедуры

&НаСервере
Процедура ЗагрузитьДанныеНаСервере(АдресФайлаВоВременномХранилище, Расширение = "xml")

	ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
	ДвоичныеДанные.Записать(ИмяВременногоФайла);

	РеквизитФормыВЗначение("Объект").ВыполнитьЗагрузку(ИмяВременногоФайла);

	Файл = Новый Файл(ИмяВременногоФайла);

	Если Файл.Существует() Тогда

		УдалитьФайлы(ИмяВременногоФайла);

	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ПересчитатьВыгружаемыеПоСсылкеНаСервере()

	ОбъектНаСервере = РеквизитФормыВЗначение("Объект");
	ЗаполнитьДеревоМетаданныхНаСервере(ОбъектНаСервере);
	ОбъектНаСервере.СоставВыгрузки(Истина);
	ЗначениеВРеквизитФормы(ОбъектНаСервере.ДеревоМетаданных, "Объект.ДеревоМетаданных");

КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДеревоМетаданныхНаСервере(ОбъектНаСервере)

	ДеревоМетаданных = РеквизитФормыВЗначение("Объект.ДеревоМетаданных");

	ОбъектНаСервере.Инициализация();

	ПроставитьПометкиВыгружаемыхДанных(ОбъектНаСервере.ДеревоМетаданных.Строки, ДеревоМетаданных.Строки);

КонецПроцедуры

&НаКлиенте
Процедура СохранитьОтображениеДерева(СтрокиДерева)

	Для Каждого Строка Из СтрокиДерева Цикл

		ИдентификаторСтроки = Строка.ПолучитьИдентификатор();
		Строка.Развернут = Элементы.ДеревоМетаданных.Развернут(ИдентификаторСтроки);

		СохранитьОтображениеДерева(Строка.ПолучитьЭлементы());

	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ВосстановитьОтображениеДерева(СтрокиДерева)

	Для Каждого Строка Из СтрокиДерева Цикл

		ИдентификаторСтроки = Строка.ПолучитьИдентификатор();
		Если Строка.Развернут Тогда
			Элементы.ДеревоМетаданных.Развернуть(ИдентификаторСтроки);
		КонецЕсли;

		ВосстановитьОтображениеДерева(Строка.ПолучитьЭлементы());

	КонецЦикла;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ИмяОбъектаПоТипуДляЗапроса(Ссылка)

	МетаданныеОбъекта = Ссылка.Метаданные();
	ИмяМетаданных = МетаданныеОбъекта.Имя;

	ИмяДляЗапроса = "";

	Если Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда
		ИмяДляЗапроса = "Справочник";
	ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда
		ИмяДляЗапроса = "Документ";
	ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеОбъекта) Тогда
		ИмяДляЗапроса = "ПланВидовХарактеристик";
	ИначеЕсли Метаданные.ПланыСчетов.Содержит(МетаданныеОбъекта) Тогда
		ИмяДляЗапроса = "ПланСчетов";
	ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит(МетаданныеОбъекта) Тогда
		ИмяДляЗапроса = "ПланВидовРасчета";
	ИначеЕсли Метаданные.ПланыОбмена.Содержит(МетаданныеОбъекта) Тогда
		ИмяДляЗапроса = "ПланОбмена";
	ИначеЕсли Метаданные.БизнесПроцессы.Содержит(МетаданныеОбъекта) Тогда
		ИмяДляЗапроса = "БизнесПроцесс";
	ИначеЕсли Метаданные.Задачи.Содержит(МетаданныеОбъекта) Тогда
		ИмяДляЗапроса = "Задача";
	КонецЕсли;

	Если ПустаяСтрока(ИмяДляЗапроса) Тогда
		Возврат "";
	Иначе
		Возврат ИмяДляЗапроса + "." + ИмяМетаданных;
	КонецЕсли;

КонецФункции

&НаСервере
Процедура ОбработкаВыбораНаСервере(ВыбранныеЗначения)

	Если ТипЗнч(ВыбранныеЗначения) = Тип("Структура") Тогда

		РезультатЗапроса = ПолучитьИзВременногоХранилища(ВыбранныеЗначения.ДанныеВыбора);

		Если ТипЗнч(РезультатЗапроса) = Тип("Массив") Тогда

			РезультатЗапроса = РезультатЗапроса[РезультатЗапроса.ВГраница()];

			Если РезультатЗапроса.Колонки.Найти("Ссылка") <> Неопределено Тогда
				ВыбранныеСсылки = РезультатЗапроса.Выгрузить();
			КонецЕсли;

		КонецЕсли;

	Иначе

		ВыбранныеСсылки = ВыбранныеЗначения;

	КонецЕсли;

	Для Каждого Значение Из ВыбранныеСсылки Цикл

		НоваяСтрока = Объект.ДополнительныеОбъектыДляВыгрузки.Добавить();
		НоваяСтрока.Объект = Значение.Ссылка;
		НоваяСтрока.ИмяОбъектаДляЗапроса = ИмяОбъектаПоТипуДляЗапроса(Значение.Ссылка);

	КонецЦикла;
КонецПроцедуры

&НаКлиенте
Процедура ВыгрузкаНаКлиентеИлиНаСервереПриИзменении(Элемент)

	ПриИзмененииРежимаРаботы();

КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура ЗагрузкаНаКлиентеИлиНаСервереПриИзменении(Элемент)

	ПриИзмененииРежимаРаботы();

КонецПроцедуры

//@skip-warning
&НаСервере
Функция ПроверитьВерсиюИРежимСовместимостиПлатформы()

	Информация = Новый СистемнаяИнформация;
	Если Не (Лев(Информация.ВерсияПриложения, 3) = "8.3" И (Метаданные.РежимСовместимости
		= Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или (Метаданные.РежимСовместимости
		<> Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_1 И Метаданные.РежимСовместимости
		<> Метаданные.СвойстваОбъектов.РежимСовместимости.Версия8_2_13 И Метаданные.РежимСовместимости
		<> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_2_16"] И Метаданные.РежимСовместимости
		<> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_3_1"] И Метаданные.РежимСовместимости
		<> Метаданные.СвойстваОбъектов.РежимСовместимости["Версия8_3_2"]))) Тогда

		ВызватьИсключение Нстр("ru = 'Обработка предназначена для запуска на версии платформы
							   |1С:Предприятие 8.3 с отключенным режимом совместимости или выше'");

	КонецЕсли;

КонецФункции

//@skip-warning
&НаКлиенте
Процедура ДеревоМетаданныхПриИзменении(Элемент)
// Вставить содержимое обработчика.
КонецПроцедуры

&НаСервере
Процедура ИнициализироватьСКД()

	СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных;
	НовыйИсточник = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
	НовыйИсточник.Имя = "ИсточникДанных1";
	НовыйИсточник.ТипИсточникаДанных = "Local";

	НовыйНаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхОбъектСхемыКомпоновкиДанных"));
	НовыйНаборДанных.ИсточникДанных = "Local";

	НовыйНаборДанных.Имя = "Основной";
	НовыйНаборДанных.ИмяОбъекта = "Основной";
	НовыйНаборДанных.ИсточникДанных = "ИсточникДанных1";

	ТаблицаМетаданных.Очистить();

	ТаблицаОбщихРеквизитов = Новый ТаблицаЗначений;

	ТаблицаОбщихРеквизитов.Колонки.Добавить("ОбъектМетаданных");
	ТаблицаОбщихРеквизитов.Колонки.Добавить("КоличествоРеквизитов");
	ТаблицаОбщихРеквизитов.Колонки.Добавить("Шапка");

	МассивТиповСсылка = Новый Массив;

	Для Каждого Элементобъектов Из РезультатВыбора Цикл

		Если Элементобъектов.значение = "Справочники" Тогда

			СтрокаТипа = "СправочникСсылка.";

		ИначеЕсли Элементобъектов.значение = "Документы" Тогда

			СтрокаТипа = "ДокументСсылка.";

		ИначеЕсли Элементобъектов.значение = "ПланыВидовРасчета" Тогда

			СтрокаТипа = "ПланВидовРасчетаСсылка.";

		ИначеЕсли Элементобъектов.значение = "ПланыВидовХарактеристик" Тогда

			СтрокаТипа = "ПланВидовХарактеристикСсылка.";

		ИначеЕсли Элементобъектов.значение = "БизнесПроцессы" Тогда

			СтрокаТипа = "БизнесПроцессСсылка.";

		ИначеЕсли Элементобъектов.значение = "Задачи" Тогда

			СтрокаТипа = "ЗадачаСсылка.";
		ИначеЕсли Элементобъектов.значение = "Константы" Тогда

			СтрокаТипа = "КонстантаМенеджер.";
		ИначеЕсли Элементобъектов.значение = "ПланыОбмена" Тогда
			СтрокаТипа = "ПланОбменассылка.";
		ИначеЕсли Элементобъектов.значение = "ПланыСчетов" Тогда
			СтрокаТипа = "ПланСчетовссылка.";
		ИначеЕсли Элементобъектов.значение = "Последовательности" Тогда
			СтрокаТипа = "ПоследовательностьМенеджер.";
		ИначеЕсли Элементобъектов.значение = "РегистрыСведений" Тогда
			СтрокаТипа = "РегистрСведенийМенеджер.";
		ИначеЕсли Элементобъектов.значение = "РегистрыНакопления" Тогда
			СтрокаТипа = "РегистрНакопленияМенеджер.";
		ИначеЕсли Элементобъектов.значение = "РегистрыБухгалтерии" Тогда
			СтрокаТипа = "РегистрБухгалтерииМенеджер.";
		КонецЕсли;

		МассивТиповСсылка.Добавить(Тип(СтрокаТипа + Элементобъектов));

	КонецЦикла;

	Для Каждого ОбъектВыбора Из РезультатВыбора Цикл

		Если ОбъектВыбора.Значение = "РегистрыСведений" Или ОбъектВыбора.Значение = "РегистрыНакопления"
			Или ОбъектВыбора.Значение = "РегистрыБухгалтерии" Тогда

			Для Каждого ОбъектМетаданных Из Метаданные[ОбъектВыбора.Значение][Строка(ОбъектВыбора)].Реквизиты Цикл

				НоваяСтрока = ТаблицаМетаданных.Добавить();

				НоваяСтрока.ИмяРеквизита = ОбъектМетаданных.Имя;
				НоваяСтрока.СинонимРеквизита = ОбъектМетаданных.Синоним;
				НоваяСтрока.ОписаниеТипов = ИсключитьНедопустимыеТипы(ОбъектМетаданных.Тип);
				НоваяСтрока.ОбъектМетаданных = ОбъектВыбора.Значение;

			КонецЦикла;

			Для Каждого ОбъектМетаданных Из Метаданные[ОбъектВыбора.Значение][Строка(
				ОбъектВыбора)].СтандартныеРеквизиты Цикл

				Если ОбъектМетаданных.Имя = "Предопределенный" Или ОбъектМетаданных.Имя = "ЭтоГруппа"
					Или ОбъектМетаданных.Имя = "Ссылка" Тогда

					Продолжить;

				Иначе

					НоваяСтрока = ТаблицаМетаданных.Добавить();

					НоваяСтрока.ИмяРеквизита = ОбъектМетаданных.Имя;
					НоваяСтрока.СинонимРеквизита = ОбъектМетаданных.Имя;
					НоваяСтрока.ОписаниеТипов = ИсключитьНедопустимыеТипы(ОбъектМетаданных.Тип);
					НоваяСтрока.ОбъектМетаданных = ОбъектВыбора.Значение;

				КонецЕсли;

			КонецЦикла;

			Для Каждого ОбъектМетаданных Из Метаданные[ОбъектВыбора.Значение][Строка(ОбъектВыбора)].Измерения Цикл

				НоваяСтрока = ТаблицаМетаданных.Добавить();

				НоваяСтрока.ИмяРеквизита = ОбъектМетаданных.Имя;
				НоваяСтрока.СинонимРеквизита = ОбъектМетаданных.Синоним;
				НоваяСтрока.ОписаниеТипов = ИсключитьНедопустимыеТипы(ОбъектМетаданных.Тип);
				НоваяСтрока.ОбъектМетаданных = ОбъектВыбора.Значение;

			КонецЦикла;

			Для Каждого ОбъектМетаданных Из Метаданные[ОбъектВыбора.Значение][Строка(ОбъектВыбора)].Ресурсы Цикл

				НоваяСтрока = ТаблицаМетаданных.Добавить();

				НоваяСтрока.ИмяРеквизита = ОбъектМетаданных.Имя;
				НоваяСтрока.СинонимРеквизита = ОбъектМетаданных.Синоним;
				НоваяСтрока.ОписаниеТипов = ИсключитьНедопустимыеТипы(ОбъектМетаданных.Тип);
				НоваяСтрока.ОбъектМетаданных = ОбъектВыбора.Значение;

			КонецЦикла;

		ИначеЕсли ОбъектВыбора.Значение <> "Константы" И ОбъектВыбора.Значение <> "Последовательности" Тогда
			КоличествоРеквизитов = Метаданные[ОбъектВыбора.Значение][Строка(ОбъектВыбора)].Реквизиты.Количество();

			Для Каждого ОбъектМетаданных Из Метаданные[ОбъектВыбора.Значение][Строка(ОбъектВыбора)].Реквизиты Цикл

				НоваяСтрока = ТаблицаМетаданных.Добавить();

				НоваяСтрока.ИмяРеквизита = ОбъектМетаданных.Имя;
				НоваяСтрока.СинонимРеквизита = ОбъектМетаданных.Синоним;
				НоваяСтрока.ОписаниеТипов = ИсключитьНедопустимыеТипы(ОбъектМетаданных.Тип);
				НоваяСтрока.ОбъектМетаданных = ОбъектВыбора.Значение;

			КонецЦикла;

			Для Каждого ОбъектМетаданных Из Метаданные[ОбъектВыбора.Значение][Строка(
				ОбъектВыбора)].СтандартныеРеквизиты Цикл

				Если ОбъектМетаданных.Имя = "Предопределенный" Или ОбъектМетаданных.Имя = "ЭтоГруппа"
					Или ОбъектМетаданных.Имя = "Ссылка" Тогда

					Продолжить;

				Иначе

					НоваяСтрока = ТаблицаМетаданных.Добавить();

					НоваяСтрока.ИмяРеквизита = ОбъектМетаданных.Имя;
					НоваяСтрока.СинонимРеквизита = ОбъектМетаданных.Имя;
					НоваяСтрока.ОписаниеТипов = ИсключитьНедопустимыеТипы(ОбъектМетаданных.Тип);
					НоваяСтрока.ОбъектМетаданных = ОбъектВыбора.Значение;

				КонецЕсли;

			КонецЦикла;
		ИначеЕсли ОбъектВыбора.Значение = "Константы" Тогда
			НоваяСтрока = ТаблицаМетаданных.Добавить();
			ОбъектМетаданных = Метаданные[ОбъектВыбора.Значение][Строка(ОбъектВыбора)];

			НоваяСтрока.ИмяРеквизита = ОбъектМетаданных.Имя;
			НоваяСтрока.СинонимРеквизита = ОбъектМетаданных.Имя;
			НоваяСтрока.ОписаниеТипов = ИсключитьНедопустимыеТипы(ОбъектМетаданных.Тип);
			НоваяСтрока.ОбъектМетаданных = ОбъектВыбора.Значение;
		ИначеЕсли ОбъектВыбора.Значение = "Последовательности" Тогда

			Для Каждого ОбъектМетаданных Из Метаданные[ОбъектВыбора.Значение][Строка(ОбъектВыбора)].Измерения Цикл
				Если ОбъектМетаданных.Имя = "Предопределенный" Или ОбъектМетаданных.Имя = "ЭтоГруппа"
					Или ОбъектМетаданных.Имя = "Ссылка" Тогда
					Продолжить;
				Иначе
					НоваяСтрока = ТаблицаМетаданных.Добавить();
					НоваяСтрока.ИмяРеквизита = ОбъектМетаданных.Имя;
					НоваяСтрока.СинонимРеквизита = ОбъектМетаданных.Имя;
					НоваяСтрока.ОписаниеТипов = ИсключитьНедопустимыеТипы(ОбъектМетаданных.Тип);
					НоваяСтрока.ОбъектМетаданных = ОбъектВыбора.Значение;
				КонецЕсли;
			КонецЦикла;

		КонецЕсли;

		Если ОбъектВыбора.Значение = "Задачи" Тогда

			КоличествоРеквизитов = КоличествоРеквизитов + Метаданные[ОбъектВыбора.Значение][Строка(
				ОбъектВыбора)].РеквизитыАдресации.Количество();

			Для Каждого ОбъектМетаданных Из Метаданные[ОбъектВыбора.Значение] Цикл
				Для Каждого ОбъектМетаданных1 Из ОбъектМетаданных.РеквизитыАдресации Цикл

					НоваяСтрока = ТаблицаМетаданных.Добавить();

					НоваяСтрока.ИмяРеквизита = ОбъектМетаданных1.Имя;
					НоваяСтрока.СинонимРеквизита = ОбъектМетаданных1.Синоним;
					НоваяСтрока.ОписаниеТипов = ИсключитьНедопустимыеТипы(ОбъектМетаданных1.Тип);
					НоваяСтрока.ОбъектМетаданных = ОбъектВыбора.Значение;

				КонецЦикла;
			КонецЦикла;

		КонецЕсли;

		Если ОбъектВыбора.Значение = "РегистрыСведений" Или ОбъектВыбора.Значение = "РегистрыНакопления"
			Или ОбъектВыбора.Значение = "РегистрыБухгалтерии" Тогда
			КоличествоРеквизитов = Метаданные[ОбъектВыбора.Значение][Строка(
				ОбъектВыбора)].СтандартныеРеквизиты.Количество() + Метаданные[ОбъектВыбора.Значение][Строка(
				ОбъектВыбора)].СтандартныеРеквизиты.Количество() + Метаданные[ОбъектВыбора.Значение][Строка(
				ОбъектВыбора)].Измерения.Количество() + Метаданные[ОбъектВыбора.Значение][Строка(
				ОбъектВыбора)].Ресурсы.Количество();

			НоваяСтрока = ТаблицаОбщихРеквизитов.Добавить();

			НоваяСтрока.ОбъектМетаданных = ОбъектВыбора;
			НоваяСтрока.КоличествоРеквизитов = КоличествоРеквизитов;
			НоваяСтрока.Шапка = Истина;

		ИначеЕсли ОбъектВыбора.Значение <> "Константы" И ОбъектВыбора.Значение <> "Последовательности" Тогда

			КоличествоРеквизитов = КоличествоРеквизитов + Метаданные[ОбъектВыбора.Значение][Строка(
				ОбъектВыбора)].СтандартныеРеквизиты.Количество();

			НоваяСтрока = ТаблицаОбщихРеквизитов.Добавить();

			НоваяСтрока.ОбъектМетаданных = ОбъектВыбора;
			НоваяСтрока.КоличествоРеквизитов = КоличествоРеквизитов;
			НоваяСтрока.Шапка = Истина;
		ИначеЕсли ОбъектВыбора.Значение = "Константы" Тогда
			КоличествоРеквизитов = 1;
			НоваяСтрока = ТаблицаОбщихРеквизитов.Добавить();
			НоваяСтрока.ОбъектМетаданных = ОбъектВыбора;
			НоваяСтрока.КоличествоРеквизитов = КоличествоРеквизитов;
			НоваяСтрока.Шапка = Истина;

			//
		ИначеЕсли ОбъектВыбора.Значение = "Последовательности" Тогда

			КоличествоРеквизитов = Метаданные[ОбъектВыбора.Значение][Строка(ОбъектВыбора)].Измерения.Количество();

			НоваяСтрока = ТаблицаОбщихРеквизитов.Добавить();

			НоваяСтрока.ОбъектМетаданных = ОбъектВыбора;
			НоваяСтрока.КоличествоРеквизитов = КоличествоРеквизитов;
			НоваяСтрока.Шапка = Истина;

		КонецЕсли;

		// {Начало изменений [25.11.2020 15:47:53] Причина: Добавление фильтра по счетам учета для регистра бухгалтерии. 
		Если ОбъектВыбора.Значение="РегистрыБухгалтерии"  И Метаданные[ОбъектВыбора.Значение][Строка(ОбъектВыбора)].Корреспонденция Тогда
			НоваяСтрока = ТаблицаМетаданных.Добавить();
            НоваяСтрока.ИмяРеквизита = "СчетДТ";
            НоваяСтрока.СинонимРеквизита = "СчетДТ";
            НоваяСтрока.ОписаниеТипов = ПланыСчетов.ТипВсеСсылки(); 
            НоваяСтрока.ОбъектМетаданных = ОбъектВыбора.Значение;
                
            НоваяСтрока = ТаблицаМетаданных.Добавить();
            НоваяСтрока.ИмяРеквизита = "СчетКТ";
            НоваяСтрока.СинонимРеквизита = "СчетКТ";
            НоваяСтрока.ОписаниеТипов = ПланыСчетов.ТипВсеСсылки(); 
            НоваяСтрока.ОбъектМетаданных = ОбъектВыбора.Значение;
		КонецЕсли;
        // }  Конец изменений [25.11.2020 15:48:46]

	КонецЦикла;

	ТаблицаОбщихРеквизитов.Сортировать("КоличествоРеквизитов возр");

	ТаблицаОбщихРеквизитов.Свернуть("КоличествоРеквизитов,ОбъектМетаданных,Шапка", "");

	Если ТаблицаОбщихРеквизитов.Количество() > 1 Тогда

		ИсключитьУникальныеРеквизиты(ТаблицаОбщихРеквизитов, Ложь);

	КонецЕсли;

	ОписаниеТиповСсылка = Новый ОписаниеТипов(МассивТиповСсылка);

	НоваяСтрока = ТаблицаМетаданных.Добавить();

	НоваяСтрока.ИмяРеквизита = "Ссылка";
	НоваяСтрока.СинонимРеквизита = "Ссылка";
	НоваяСтрока.ОписаниеТипов = ОписаниеТиповСсылка;

	ТаблицаМетаданных.Сортировать("Шапка возр,ИмяРеквизита возр");

	Для Каждого ЭлементРеквизит Из ТаблицаМетаданных Цикл

		ИмяРеквизита = СтрЗаменить(ЭлементРеквизит.ИмяРеквизита, ".", "*$");
		//ИмяРеквизита=ЭлементРеквизит.ИмяРеквизита;
		НовоеПолеНабораДанных = НовыйНаборДанных.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
		НовоеПолеНабораДанных.Заголовок = ЭлементРеквизит.СинонимРеквизита;

		НовоеПолеНабораДанных.Поле = ИмяРеквизита;
		НовоеПолеНабораДанных.ТипЗначения = ЭлементРеквизит.ОписаниеТипов;
		НовоеПолеНабораДанных.ПутьКДанным = ИмяРеквизита;

		Если ЭлементРеквизит.ИмяРеквизита = "ИмяТЧ" Тогда

			НовоеПолеНабораДанных.ОграничениеИспользования.Условие = Истина;
			НовоеПолеНабораДанных.ОграничениеИспользования.Порядок = Истина;

		КонецЕсли;

	КонецЦикла;

	НастройкиКомпоновки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;

	НоваяГруппировка = НастройкиКомпоновки.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	НоваяГруппировка.Использование = Истина;

	Для Каждого ЭлементРеквизит Из ТаблицаМетаданных Цикл

		НовоеПолеКомпоновкиДанных = НоваяГруппировка.ПоляГруппировки.Элементы.Добавить(Тип(
			"ПолеГруппировкиКомпоновкиДанных"));
		НовоеПолеКомпоновкиДанных.Использование = Истина;

		НовоеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных(ЭлементРеквизит.ИмяРеквизита);

		ВыбранноеПоле = НоваяГруппировка.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
		ВыбранноеПоле.Использование = Истина;
		ВыбранноеПоле.Заголовок = ЭлементРеквизит.СинонимРеквизита;
		ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(ЭлементРеквизит.ИмяРеквизита);

	КонецЦикла;

	АдресСКД = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, ЭтаФорма.УникальныйИдентификатор);

	ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСКД);

	Объект.Компоновщик.Инициализировать(ИсточникНастроек);

	Объект.Компоновщик.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);

	Если ТипОбъекта = "Документы" Тогда

		НовоеПолеСортировки = Объект.Компоновщик.Настройки.Порядок.Элементы.Добавить(Тип(
			"ЭлементПорядкаКомпоновкиДанных"));
		НовоеПолеСортировки.Поле = Новый ПолеКомпоновкиДанных("Дата");

		НовоеПолеСортировки = Объект.Компоновщик.Настройки.Порядок.Элементы.Добавить(Тип(
			"ЭлементПорядкаКомпоновкиДанных"));
		НовоеПолеСортировки.Поле = Новый ПолеКомпоновкиДанных("Ссылка");

	ИначеЕсли ТипОбъекта = "ПланыВидовХарактеристик" Тогда

		ИнициализироватьДопОтборХарактеристик();

	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ИнициализироватьДопОтборХарактеристик()

	ОписаниеТипов = Новый ОписаниеТипов;

	Для Каждого ВыбраннаяХарактеристика Из РезультатВыбора Цикл

		ТипыЗначенияХарактеристики = Метаданные.ПланыВидовХарактеристик[ВыбраннаяХарактеристика.Значение].Тип;
		ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, ТипыЗначенияХарактеристики.Типы());

	КонецЦикла;

//	ТипЗначенияХарактеристики = Новый ОписаниеТипов(ОписаниеТипов);

КонецПроцедуры

&НаСервере
Процедура ПодготовитьСписокВыбранныхОбъектов(ТекущиеДанныеИмя, ИмяОбъектаМетаданных)

	РезультатВыбора = Новый СписокЗначений;
	ПодготовитьСписокВыбранных(РезультатВыбора, ТекущиеДанныеИмя, ИмяОбъектаМетаданных);

	КэшОтбора = Объект.Компоновщик.Настройки.Отбор.Элементы;

	Если РезультатВыбора <> Неопределено Тогда

		ТаблицаМетаданных.Очистить();
		ТаблицаВидыОбъектов.Очистить();

		Для Каждого ЭлементРезультат Из РезультатВыбора Цикл

			НоваяСтрока = ТаблицаВидыОбъектов.Добавить();
			НоваяСтрока.ИмяТаблицы = ЭлементРезультат.Значение;
			НоваяСтрока.ПредставлениеТаблицы = ЭлементРезультат.Представление;

		КонецЦикла;

		ИнициализироватьСКД();

	КонецЕсли;

	КэшВидимыхКолонок.Очистить();

	ВосстановитьОтборИзКэша(Объект.Компоновщик.Настройки.Отбор.Элементы, КэшОтбора,
		Объект.Компоновщик.Настройки.Отбор.ДоступныеПоляОтбора);

	ОчиститьУО();

КонецПроцедуры

&НаСервере
Процедура ОчиститьУО()
	;

	Если ЭтаФорма.УсловноеОформление.Элементы.Количество() > 0 Тогда

		ЭтаФорма.УсловноеОформление.Элементы.Очистить();

	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ПодготовитьСписокВыбранных(СписокВыбора, ТекущиеДанныеИмя, ИмяОбъектаМетаданных)

	ОбъектНаСервере = РеквизитФормыВЗначение("Объект");
	//ЗначениеВРеквизитФормы(ОбъектНаСервере.ДеревоМетаданных, "Объект.ДеревоМетаданных");
	ДеревоМетаданных1 = ОбъектНаСервере.ДеревоМетаданных;
	//РеквизитФормыВЗначение("ДеревоМетаданных");
	СписокГруппЭлементов = ДеревоМетаданных1.Строки[0].Строки;

	Для Каждого ЭлементСтрока Из СписокГруппЭлементов Цикл
	//Если ЭлементСтрока.Выгружать>0 Тогда
		Для Каждого ЭлементМетаданных Из ЭлементСтрока.Строки Цикл
			Если ЭлементМетаданных.ПолноеИмяМетаданных = ТекущиеДанныеИмя И ЭлементМетаданных.ИмяОбъектаМетаданных
				= ИмяОбъектаМетаданных Тогда
				СписокВыбора.Добавить(ЭлементСтрока.ПолноеИмяМетаданных, ЭлементМетаданных.ПолноеИмяМетаданных);
				Прервать;
			КонецЕсли;
		КонецЦикла;
		//КонецЕсли;
	КонецЦикла;

КонецПроцедуры

&НаСервере
Функция ИсключитьНедопустимыеТипы(ТипРеквизита)

	МассивНедопустимых = ПолучитьНедопустимыеТипы();

	МассивИсключаемыхТипов = Новый Массив;

	Для Каждого ЭлементНедопустимый Из МассивНедопустимых Цикл

		Если ТипРеквизита.СодержитТип(ЭлементНедопустимый) Тогда

			МассивИсключаемыхТипов.Добавить(ЭлементНедопустимый);

		КонецЕсли;

	КонецЦикла;

	Если МассивИсключаемыхТипов.Количество() = 0 Тогда

		ОписаниеРеквизита = ТипРеквизита;

	Иначе

		ОписаниеРеквизита = Новый ОписаниеТипов(ТипРеквизита, , МассивИсключаемыхТипов);

	КонецЕсли;

	Возврат ОписаниеРеквизита;

КонецФункции

&НаСервере
Процедура ИсключитьУникальныеРеквизиты(ТаблицаОбщихРеквизитов, ОбрабатыватьТЧ)

	ТаблКолич = ТаблицаОбщихРеквизитов.Скопировать();

	ТаблицаРезультат = ТаблицаМетаданных.Выгрузить();

	ТаблКолич.Колонки.Добавить("Колич");

	Для Каждого Строка Из ТаблКолич Цикл
		Строка.Колич = 1;
	КонецЦикла;

	ТаблКолич.Свернуть("Шапка", "Колич");

	ТаблицаРезультат.Колонки.Добавить("Колич");
	//ТаблицаРезультат.Колонки.Добавить("Шапка");
	Для Каждого Строка Из ТаблицаРезультат Цикл
		Строка.Колич = 1;
		Если Не ОбрабатыватьТЧ Тогда
			Строка.Шапка = Истина;
		ИначеЕсли Врег(Лев(Строка.ИмяРеквизита, 6)) = "ССЫЛКА" Тогда
			Строка.Шапка = Истина;
		Иначе
			Строка.Шапка = Ложь;
		КонецЕсли;
	КонецЦикла;

	//  приводим к одному типу квалификаторы типа число
	Для Каждого Строка Из ТаблицаРезультат Цикл
		Если СокрЛП(Строка.ОписаниеТипов) = "Число" Тогда
			Разрядность = Строка.ОписаниеТипов.КвалификаторыЧисла.Разрядность;
			РазрядностьДробнойЧасти = Строка.ОписаниеТипов.КвалификаторыЧисла.РазрядностьДробнойЧасти;
			//ДопустимыйЗнак=Строка.ОписаниеТипов.КвалификаторыЧисла.ДопустимыйЗнак;
			Массив = Новый Массив;
			Массив.Добавить(Тип("Число"));

			ПараметрыЧисла = Новый КвалификаторыЧисла(Разрядность, РазрядностьДробнойЧасти);

			Строка.ОписаниеТипов = Новый ОписаниеТипов(Массив, , , ПараметрыЧисла);

		КонецЕсли;
	КонецЦикла;

	ТаблицаРезультат.Свернуть("ИмяРеквизита,Синонимреквизита,ОписаниеТипов,Шапка", "Колич");

	// Чистим все не дублирующиеся элементы, оставляем только дубли 
	КолМакс = 0;
	Для Каждого Строка3 Из ТаблицаРезультат Цикл
		Если Строка3.Колич > КолМакс Тогда
			КолМакс = Строка3.Колич;
		КонецЕсли;

	КонецЦикла;

	Колво = ТаблицаРезультат.Количество();
	//КолМакс=ТаблКолич.Количество();
	Пока КолВо > 0 Цикл
		Строка = ТаблицаРезультат[КолВо - 1];
		Если Строка.Колич <> КолМакс Тогда
			ТаблицаРезультат.Удалить(Строка);
		КонецЕсли;
		Колво = Колво - 1;
	КонецЦикла;

	ТаблицаРезультат.Свернуть("ИмяРеквизита,Синонимреквизита,ОписаниеТипов,Шапка", "");

	ТаблицаМетаданных.Очистить();
	ТаблицаМетаданных.Загрузить(ТаблицаРезультат);

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьНедопустимыеТипы()

	МассивНедопустимыхТипов = Новый Массив;
	МассивНедопустимыхТипов.Добавить(Тип("ХранилищеЗначения"));

	Возврат МассивНедопустимыхТипов;

КонецФункции

&НаКлиенте
Процедура СкопироватьОтбор(Команда)
// Вставить содержимое обработчика.
	ТекущиеДанныеИмя = Элементы.ДеревоМетаданных.ТекущиеДанные.ПолноеИмяМетаданных;
//	ТекущаяСтрока = Элементы.ДеревоМетаданных.ТекущаяСтрока;
//	ТекущиеДанные = Элементы.ДеревоМетаданных.ТекущиеДанные;
	ТекущийЭлемент = Элементы.ДеревоМетаданных.ТекущийЭлемент;

	СкопироватьОтборнаСервере(ТекущиеДанныеИмя);

КонецПроцедуры

// Обходим дерево и проставляем флажок выводить
&НаСервере
Процедура СкопироватьОтборнаСервере(ТекущиеДанныеИмя)

	Дерево1 = Объект.ДеревоМетаданных.ПолучитьЭлементы();

	//РеквизитФормыВЗначение("Объект.ДеревоМетаданных");
	ОбъектСсылка = РеквизитФормыВЗначение("Объект");

	ТаблицаОтбораТекущ = ОбъектСсылка.Компоновщик.Настройки.Отбор;

	ТаблицаОтбора1 = РеквизитФормыВЗначение("ТаблицаОтбора");
//	НомерТекущейСтрокиДерева = 0;

	Для Каждого СтрокаРодитель Из Дерево1[0].ПолучитьЭлементы() Цикл
		Если СтрокаРодитель.ПолноеИмяМетаданных <> "Константы" Тогда
			Для Каждого ВетвьДерева Из СтрокаРодитель.ПолучитьЭлементы() Цикл
				ВетвьДереваВыделить = Ложь;

				Если СтрокаРодитель.ПолноеИмяМетаданных = "Последовательности" Тогда
					МетадатаИзмерения = Метаданные[СтрокаРодитель.ПолноеИмяМетаданных][ВетвьДерева.ПолноеИмяМетаданных].Измерения;
					Для Каждого СтрокаОтбора Из ТаблицаОтбораТекущ.Элементы Цикл
						Для Каждого СтрокаИзмерения Из МетадатаИзмерения Цикл
							Если СтрокаИзмерения.Имя = Строка(СтрокаОтбора.ЛевоеЗначение) Тогда
								ВетвьДереваВыделить = Истина;
								//Сообщить(СтрокаИзмерения.Имя);
								Найдено = Ложь;
								Для Каждого СтрокаОтбораТаблица Из ТаблицаОтбора1 Цикл
									Если СтрокаОтбораТаблица.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных Тогда
										Найдено = Истина;
										НайденоРеквизит = Ложь;
										Для Каждого СтрокаОтбораТаблицаОтбор Из СтрокаОтбораТаблица.Отбор.Элементы Цикл
											Если СтрокаОтбораТаблицаОтбор.ЛевоеЗначение = СтрокаОтбора.ЛевоеЗначение Тогда
												НайденоРеквизит = Истина;
												ЗаполнитьЗначенияСвойств(СтрокаОтбораТаблицаОтбор, СтрокаОтбора);

												Прервать;
											КонецЕсли;
										КонецЦикла;
										Если Не НайденоРеквизит Тогда

											НовоеПоле = СтрокаОтбораТаблица.Отбор.Элементы.Добавить(Тип(
												"ЭлементОтбораКомпоновкиДанных"));
											ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);

										КонецЕсли;

										Прервать;
									КонецЕсли;
								КонецЦикла;

								Если Не Найдено Тогда
								//НоваяСтрока.ИмяРеквизита=ТекущиеДанныеИмя;
									НоваяСтрока = ТаблицаОтбора1.Добавить();
									НоваяСтрока.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных;
									НоваяСтрока.ИмяОбъектаМетаданных = СтрокаРодитель.ПолноеИмяМетаданных;

									НовоеПоле = НоваяСтрока.Отбор.Элементы.Добавить(Тип(
										"ЭлементОтбораКомпоновкиДанных"));
									ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);

								КонецЕсли;

							КонецЕсли;
						КонецЦикла;
					КонецЦикла;
				ИначеЕсли СтрокаРодитель.ПолноеИмяМетаданных = "РегистрыСведений"
					Или СтрокаРодитель.ПолноеИмяМетаданных = "РегистрыНакопления"
					Или СтрокаРодитель.ПолноеИмяМетаданных = "РегистрыБухгалтерии" Тогда

					МетадатаИзмерения = Метаданные[СтрокаРодитель.ПолноеИмяМетаданных][ВетвьДерева.ПолноеИмяМетаданных].Измерения;
					Для Каждого СтрокаОтбора Из ТаблицаОтбораТекущ.Элементы Цикл
						Для Каждого СтрокаИзмерения Из МетадатаИзмерения Цикл
							Если СтрокаИзмерения.Имя = Строка(СтрокаОтбора.ЛевоеЗначение) Тогда
								ВетвьДереваВыделить = Истина;

								Найдено = Ложь;
								Для Каждого СтрокаОтбораТаблица Из ТаблицаОтбора1 Цикл
									Если СтрокаОтбораТаблица.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных Тогда
										Найдено = Истина;
										НайденоРеквизит = Ложь;
										Для Каждого СтрокаОтбораТаблицаОтбор Из СтрокаОтбораТаблица.Отбор.Элементы Цикл
											Если СтрокаОтбораТаблицаОтбор.ЛевоеЗначение = СтрокаОтбора.ЛевоеЗначение Тогда
												НайденоРеквизит = Истина;
												ЗаполнитьЗначенияСвойств(СтрокаОтбораТаблицаОтбор, СтрокаОтбора);

												Прервать;
											КонецЕсли;
										КонецЦикла;
										Если Не НайденоРеквизит Тогда

											НовоеПоле = СтрокаОтбораТаблица.Отбор.Элементы.Добавить(Тип(
												"ЭлементОтбораКомпоновкиДанных"));
											ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);

										КонецЕсли;

										Прервать;
									КонецЕсли;
								КонецЦикла;

								Если Не Найдено Тогда
								//НоваяСтрока.ИмяРеквизита=ТекущиеДанныеИмя;
									НоваяСтрока = ТаблицаОтбора1.Добавить();
									НоваяСтрока.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных;
									НоваяСтрока.ИмяОбъектаМетаданных = СтрокаРодитель.ПолноеИмяМетаданных;
									НовоеПоле = НоваяСтрока.Отбор.Элементы.Добавить(Тип(
										"ЭлементОтбораКомпоновкиДанных"));
									ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);

								КонецЕсли;

								//Сообщить(СтрокаИзмерения.Имя);
							КонецЕсли;
						КонецЦикла;
					КонецЦикла;

					Метадатареквизиты = Метаданные[СтрокаРодитель.ПолноеИмяМетаданных][ВетвьДерева.ПолноеИмяМетаданных].Реквизиты;
					Для Каждого СтрокаОтбора Из ТаблицаОтбораТекущ.Элементы Цикл
						Для Каждого СтрокаРеквизиты Из Метадатареквизиты Цикл
							Если СтрокаРеквизиты.Имя = Строка(СтрокаОтбора.ЛевоеЗначение) Тогда
								ВетвьДереваВыделить = Истина;

								Найдено = Ложь;
								Для Каждого СтрокаОтбораТаблица Из ТаблицаОтбора1 Цикл
									Если СтрокаОтбораТаблица.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных Тогда
										Найдено = Истина;
										НайденоРеквизит = Ложь;
										Для Каждого СтрокаОтбораТаблицаОтбор Из СтрокаОтбораТаблица.Отбор.Элементы Цикл
											Если СтрокаОтбораТаблицаОтбор.ЛевоеЗначение = СтрокаОтбора.ЛевоеЗначение Тогда
												НайденоРеквизит = Истина;
												ЗаполнитьЗначенияСвойств(СтрокаОтбораТаблицаОтбор, СтрокаОтбора);

												Прервать;
											КонецЕсли;
										КонецЦикла;
										Если Не НайденоРеквизит Тогда

											НовоеПоле = СтрокаОтбораТаблица.Отбор.Элементы.Добавить(Тип(
												"ЭлементОтбораКомпоновкиДанных"));
											ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);

										КонецЕсли;

										Прервать;
									КонецЕсли;
								КонецЦикла;

								Если Не Найдено Тогда
								//НоваяСтрока.ИмяРеквизита=ТекущиеДанныеИмя;
									НоваяСтрока = ТаблицаОтбора1.Добавить();
									НоваяСтрока.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных;
									НоваяСтрока.ИмяОбъектаМетаданных = СтрокаРодитель.ПолноеИмяМетаданных;

									НовоеПоле = НоваяСтрока.Отбор.Элементы.Добавить(Тип(
										"ЭлементОтбораКомпоновкиДанных"));
									ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);

								КонецЕсли;

								//Сообщить(СтрокаРеквизиты.Имя);
							КонецЕсли;
						КонецЦикла;
					КонецЦикла;

					Метадатареквизиты = Метаданные[СтрокаРодитель.ПолноеИмяМетаданных][ВетвьДерева.ПолноеИмяМетаданных].СтандартныеРеквизиты;
					Для Каждого СтрокаОтбора Из ТаблицаОтбораТекущ.Элементы Цикл
						Для Каждого СтрокаРеквизиты Из Метадатареквизиты Цикл
							Если СтрокаРеквизиты.Имя = Строка(СтрокаОтбора.ЛевоеЗначение) Тогда
								ВетвьДереваВыделить = Истина;

								Найдено = Ложь;
								Для Каждого СтрокаОтбораТаблица Из ТаблицаОтбора1 Цикл
									Если СтрокаОтбораТаблица.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных Тогда
										Найдено = Истина;
										НайденоРеквизит = Ложь;
										Для Каждого СтрокаОтбораТаблицаОтбор Из СтрокаОтбораТаблица.Отбор.Элементы Цикл
											Если СтрокаОтбораТаблицаОтбор.ЛевоеЗначение = СтрокаОтбора.ЛевоеЗначение Тогда
												НайденоРеквизит = Истина;
												ЗаполнитьЗначенияСвойств(СтрокаОтбораТаблицаОтбор, СтрокаОтбора);

												Прервать;
											КонецЕсли;
										КонецЦикла;
										Если Не НайденоРеквизит Тогда

											НовоеПоле = СтрокаОтбораТаблица.Отбор.Элементы.Добавить(Тип(
												"ЭлементОтбораКомпоновкиДанных"));
											ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);

										КонецЕсли;

										Прервать;
									КонецЕсли;
								КонецЦикла;

								Если Не Найдено Тогда
								//НоваяСтрока.ИмяРеквизита=ТекущиеДанныеИмя;
									НоваяСтрока = ТаблицаОтбора1.Добавить();
									НоваяСтрока.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных;
									НоваяСтрока.ИмяОбъектаМетаданных = СтрокаРодитель.ПолноеИмяМетаданных;
									НовоеПоле = НоваяСтрока.Отбор.Элементы.Добавить(Тип(
										"ЭлементОтбораКомпоновкиДанных"));
									ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);

								КонецЕсли;

								//Сообщить(СтрокаРеквизиты.Имя);
							КонецЕсли;
						КонецЦикла;
					КонецЦикла;

				Иначе
					Метадатареквизиты = Метаданные[СтрокаРодитель.ПолноеИмяМетаданных][ВетвьДерева.ПолноеИмяМетаданных].Реквизиты;
					СтандартныеРеквизиты = Метаданные[СтрокаРодитель.ПолноеИмяМетаданных][ВетвьДерева.ПолноеИмяМетаданных].Стандартныереквизиты;
					Для Каждого СтрокаОтбора Из ТаблицаОтбораТекущ.Элементы Цикл

						Для Каждого СтрокаРеквизиты Из Метадатареквизиты Цикл
							Если СтрокаРеквизиты.Имя = Строка(СтрокаОтбора.ЛевоеЗначение) Тогда
								ВетвьДереваВыделить = Истина;

								//  Добавляем отбор в таблицу
								// Ищем существующий отбор в таблице, если нет то добавляем новый
								// если находим то ищем существующий реквизит отбора, если находим заменяем его
								// если нет то просто дабавляем 
								Найдено = Ложь;
								Для Каждого СтрокаОтбораТаблица Из ТаблицаОтбора1 Цикл
									Если СтрокаОтбораТаблица.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных Тогда
										Найдено = Истина;
										НайденоРеквизит = Ложь;
										Для Каждого СтрокаОтбораТаблицаОтбор Из СтрокаОтбораТаблица.Отбор.Элементы Цикл
											Если СтрокаОтбораТаблицаОтбор.ЛевоеЗначение = СтрокаОтбора.ЛевоеЗначение Тогда
												НайденоРеквизит = Истина;
												ЗаполнитьЗначенияСвойств(СтрокаОтбораТаблицаОтбор, СтрокаОтбора);

												Прервать;
											КонецЕсли;
										КонецЦикла;
										Если Не НайденоРеквизит Тогда

											НовоеПоле = СтрокаОтбораТаблица.Отбор.Элементы.Добавить(Тип(
												"ЭлементОтбораКомпоновкиДанных"));
											ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);

										КонецЕсли;

										Прервать;
									КонецЕсли;
								КонецЦикла;

								Если Не Найдено Тогда
								//НоваяСтрока.ИмяРеквизита=ТекущиеДанныеИмя;
									НоваяСтрока = ТаблицаОтбора1.Добавить();
									НоваяСтрока.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных;
									НоваяСтрока.ИмяОбъектаМетаданных = СтрокаРодитель.ПолноеИмяМетаданных;

									НовоеПоле = НоваяСтрока.Отбор.Элементы.Добавить(Тип(
										"ЭлементОтбораКомпоновкиДанных"));
									ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);

								КонецЕсли;
							КонецЕсли;
						КонецЦикла;

						Для Каждого СтрокаРеквизиты Из Стандартныереквизиты Цикл
							Если СтрокаРеквизиты.Имя = Строка(СтрокаОтбора.ЛевоеЗначение) Тогда
								ВетвьДереваВыделить = Истина;

								//  Добавляем отбор в таблицу
								// Ищем существующий отбор в таблице, если нет то добавляем новый
								// если находим то ищем существующий реквизит отбора, если находим заменяем его
								// если нет то просто дабавляем 
								Найдено = Ложь;
								Для Каждого СтрокаОтбораТаблица Из ТаблицаОтбора1 Цикл
									Если СтрокаОтбораТаблица.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных Тогда
										Найдено = Истина;
										НайденоРеквизит = Ложь;
										Для Каждого СтрокаОтбораТаблицаОтбор Из СтрокаОтбораТаблица.Отбор.Элементы Цикл
											Если СтрокаОтбораТаблицаОтбор.ЛевоеЗначение = СтрокаОтбора.ЛевоеЗначение Тогда
												НайденоРеквизит = Истина;
												ЗаполнитьЗначенияСвойств(СтрокаОтбораТаблицаОтбор, СтрокаОтбора);

												Прервать;
											КонецЕсли;
										КонецЦикла;
										Если Не НайденоРеквизит Тогда
											НовоеПоле = СтрокаОтбораТаблица.Отбор.Элементы.Добавить(Тип(
												"ЭлементОтбораКомпоновкиДанных"));
											ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);
										КонецЕсли;
										Прервать;
									КонецЕсли;
								КонецЦикла;

								Если Не Найдено Тогда
									НоваяСтрока = ТаблицаОтбора1.Добавить();
									НоваяСтрока.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных;
									НоваяСтрока.ИмяОбъектаМетаданных = СтрокаРодитель.ПолноеИмяМетаданных;

									НовоеПоле = НоваяСтрока.Отбор.Элементы.Добавить(Тип(
										"ЭлементОтбораКомпоновкиДанных"));
									ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);
								КонецЕсли;
							КонецЕсли;
							//
							//
						КонецЦикла;
						Если Найти(Строка(СтрокаОтбора.ЛевоеЗначение), ".") > 0 Тогда
							найдено8 = Ложь;
							Для Каждого СтрокаРеквизиты Из Стандартныереквизиты Цикл
								Если Лев(СтрокаОтбора.ЛевоеЗначение, Найти(Строка(СтрокаОтбора.ЛевоеЗначение), ".")
									- 1) = СтрокаРеквизиты.Имя Тогда
									Если НайтиРеквизитВДеревеРевизитовМетаданных(
										Метаданные[СтрокаРодитель.ПолноеИмяМетаданных][ВетвьДерева.ПолноеИмяМетаданных],
										Лев(СтрокаОтбора.ЛевоеЗначение, Найти(Строка(СтрокаОтбора.ЛевоеЗначение), ".")
										- 1), Прав(СтрокаОтбора.ЛевоеЗначение, СтрДлина(СтрокаОтбора.ЛевоеЗначение)
										- Найти(Строка(СтрокаОтбора.ЛевоеЗначение), "."))) Тогда
										ВетвьДереваВыделить = Истина;
										Найдено = Ложь;
										Для Каждого СтрокаОтбораТаблица Из ТаблицаОтбора1 Цикл
											Если СтрокаОтбораТаблица.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных Тогда
												Найдено = Истина;
												НайденоРеквизит = Ложь;
												Для Каждого СтрокаОтбораТаблицаОтбор Из СтрокаОтбораТаблица.Отбор.Элементы Цикл
													Если СтрокаОтбораТаблицаОтбор.ЛевоеЗначение
														= СтрокаОтбора.ЛевоеЗначение Тогда
														НайденоРеквизит = Истина;
														ЗаполнитьЗначенияСвойств(СтрокаОтбораТаблицаОтбор, СтрокаОтбора);

														Прервать;
													КонецЕсли;
												КонецЦикла;
												Если Не НайденоРеквизит Тогда
													НовоеПоле = СтрокаОтбораТаблица.Отбор.Элементы.Добавить(Тип(
														"ЭлементОтбораКомпоновкиДанных"));
													ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);
												КонецЕсли;
												Прервать;
											КонецЕсли;
										КонецЦикла;

										Если Не Найдено Тогда
											НоваяСтрока = ТаблицаОтбора1.Добавить();
											НоваяСтрока.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных;
											НоваяСтрока.ИмяОбъектаМетаданных = СтрокаРодитель.ПолноеИмяМетаданных;

											НовоеПоле = НоваяСтрока.Отбор.Элементы.Добавить(Тип(
												"ЭлементОтбораКомпоновкиДанных"));
											ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);
										КонецЕсли;

										Прервать;
									КонецЕсли;
								КонецЕсли;
							КонецЦикла;
							Если Не найдено8 Тогда
								Для Каждого СтрокаРеквизиты Из Метадатареквизиты Цикл
									Если Лев(СтрокаОтбора.ЛевоеЗначение, Найти(Строка(СтрокаОтбора.ЛевоеЗначение), ".")
										- 1) = СтрокаРеквизиты.Имя Тогда
										Если НайтиРеквизитВДеревеРевизитовМетаданных(
											Метаданные[СтрокаРодитель.ПолноеИмяМетаданных][ВетвьДерева.ПолноеИмяМетаданных],
											Лев(СтрокаОтбора.ЛевоеЗначение, Найти(Строка(СтрокаОтбора.ЛевоеЗначение),
											".") - 1), Прав(СтрокаОтбора.ЛевоеЗначение, СтрДлина(
											СтрокаОтбора.ЛевоеЗначение) - Найти(Строка(СтрокаОтбора.ЛевоеЗначение),
											"."))) Тогда
											ВетвьДереваВыделить = Истина;
											Найдено = Ложь;
											Для Каждого СтрокаОтбораТаблица Из ТаблицаОтбора1 Цикл
												Если СтрокаОтбораТаблица.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных Тогда
													Найдено = Истина;
													НайденоРеквизит = Ложь;
													Для Каждого СтрокаОтбораТаблицаОтбор Из СтрокаОтбораТаблица.Отбор.Элементы Цикл
														Если СтрокаОтбораТаблицаОтбор.ЛевоеЗначение
															= СтрокаОтбора.ЛевоеЗначение Тогда
															НайденоРеквизит = Истина;
															ЗаполнитьЗначенияСвойств(СтрокаОтбораТаблицаОтбор,
																СтрокаОтбора);

															Прервать;
														КонецЕсли;
													КонецЦикла;
													Если Не НайденоРеквизит Тогда
														НовоеПоле = СтрокаОтбораТаблица.Отбор.Элементы.Добавить(Тип(
															"ЭлементОтбораКомпоновкиДанных"));
														ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);
													КонецЕсли;
													Прервать;
												КонецЕсли;
											КонецЦикла;

											Если Не Найдено Тогда
												НоваяСтрока = ТаблицаОтбора1.Добавить();
												НоваяСтрока.ИмяРеквизита = ВетвьДерева.ПолноеИмяМетаданных;
												НоваяСтрока.ИмяОбъектаМетаданных = СтрокаРодитель.ПолноеИмяМетаданных;

												НовоеПоле = НоваяСтрока.Отбор.Элементы.Добавить(Тип(
													"ЭлементОтбораКомпоновкиДанных"));
												ЗаполнитьЗначенияСвойств(НовоеПоле, СтрокаОтбора);
											КонецЕсли;

											Прервать;
										КонецЕсли;
									КонецЕсли;
								КонецЦикла;
							КонецЕсли;
						КонецЕсли;

					КонецЦикла;
				КонецЕсли;
				Если ВетвьДереваВыделить И Не ВетвьДерева.Выделить Тогда
					ВетвьДерева.ИндексКартинки = ВетвьДерева.ИндексКартинки + 1;
					ВетвьДерева.Выделить = ВетвьДереваВыделить;
				КонецЕсли;

			КонецЦикла;
		КонецЕсли;

	КонецЦикла;

	ЗначениеВреквизитФормы(ТаблицаОтбора1, "ТаблицаОтбора");

КонецПроцедуры

&НаСервере
Функция НайтиРеквизитВДеревеРевизитовМетаданных(Метаданные1, Реквизит2, Строка1)
	ВозвращЗначение = Ложь;

	//Метаданные.НайтиПоТипу(Строка.Тип.Типы()[0])
	Реквизиты1 = Метаданные1.Реквизиты;

	СтандартныеРеквизиты1 = Метаданные1.СтандартныеРеквизиты;

	Для Каждого Строка Из СтандартныеРеквизиты1 Цикл
		Если Строка.имя = Реквизит2 Тогда

			Если Не (Строка(Строка.Тип.Типы()[0]) = "Строка" Или Строка(Строка.Тип.Типы()[0]) = "Дата" Или Строка(
				Строка.Тип.Типы()[0]) = "Число" Или Строка(Строка.Тип.Типы()[0]) = "Булево") Тогда

				Метадата2 = Метаданные.НайтиПоТипу(Строка.Тип.Типы()[0]);

				Реквизиты3 = Метадата2.Реквизиты;
				СтандартныеРеквизиты3 = Метадата2.СтандартныеРеквизиты;

				Если найти(Строка1, ".") > 0 Тогда
					ВозвращЗначение = НайтиРеквизитВДеревеРевизитовМетаданных(Метадата2, Лев(Строка1, найти(Строка1, ".")
						- 1), Прав(Строка1, СтрДлина(Строка1) - найти(Строка1, ".")));
				Иначе
					Для Каждого Строка Из СтандартныеРеквизиты3 Цикл
						Если Строка.имя = Строка1 Тогда
							ВозвращЗначение = Истина;
							Прервать;
						КонецЕсли;
					КонецЦикла;

					Если Не ВозвращЗначение Тогда
						Для Каждого Строка Из Реквизиты3 Цикл
							Если Строка.имя = Строка1 Тогда
								ВозвращЗначение = Истина;
								Прервать;
							КонецЕсли;
						КонецЦикла;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
			//ВозвращЗначение=Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Если Не ВозвращЗначение Тогда
		Для Каждого Строка Из Реквизиты1 Цикл
			Если Строка.имя = Реквизит2 Тогда

				Если Не (Строка(Строка.Тип.Типы()[0]) = "Строка" Или Строка(Строка.Тип.Типы()[0]) = "Дата" Или Строка(
					Строка.Тип.Типы()[0]) = "Число" Или Строка(Строка.Тип.Типы()[0]) = "Булево") Тогда

					Метадата2 = Метаданные.НайтиПоТипу(Строка.Тип.Типы()[0]);

					Реквизиты3 = Метадата2.Реквизиты;
					СтандартныеРеквизиты3 = Метадата2.СтандартныеРеквизиты;
					Если найти(Строка1, ".") > 0 Тогда
						ВозвращЗначение = НайтиРеквизитВДеревеРевизитовМетаданных(Метадата2, Лев(Строка1, найти(
							Строка1, ".") - 1), Прав(Строка1, СтрДлина(Строка1) - найти(Строка1, ".")));
					Иначе

						Для Каждого Строка Из СтандартныеРеквизиты3 Цикл
							Если Строка.имя = Строка1 Тогда
								ВозвращЗначение = Истина;
								Прервать;
							КонецЕсли;
						КонецЦикла;

						Если Не ВозвращЗначение Тогда
							Для Каждого Строка Из Реквизиты3 Цикл
								Если Строка.имя = Строка1 Тогда
									ВозвращЗначение = Истина;
									Прервать;
								КонецЕсли;
							КонецЦикла;
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
				//ВозвращЗначение=Истина;
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

	Возврат ВозвращЗначение;
КонецФункции

&НаКлиенте
Процедура ДеревоМетаданныхПриАктивизацииСтроки(Элемент)
// Вставить содержимое обработчика.
	ТекущиеДанныеИмя = Элементы.ДеревоМетаданных.ТекущиеДанные.ПолноеИмяМетаданных;

	//ТаблицаРезультатОтбор.Очистить();
	ПодготовитьСписокВыбранныхОбъектов(ТекущиеДанныеИмя, Элементы.ДеревоМетаданных.ТекущиеДанные.ИмяОбъектаМетаданных);

	ОбновитьОтборПоАктивизацииНаСервере(ТекущиеДанныеИмя, Элементы.ДеревоМетаданных.ТекущиеДанные.ИмяОбъектаМетаданных);

КонецПроцедуры

&НаСервере
Процедура ОбновитьОтборПоАктивизацииНаСервере(ТекущиеДанныеИмя, ИмяОбъектаМетаданных)
	;

	//	ОбъектНаСервере = РеквизитФормыВЗначение("Объект");
	//ЗначениеВРеквизитФормы(ОбъектНаСервере.ДеревоМетаданных, "Объект.ДеревоМетаданных");
	//	ДеревоМетаданных1 = ОбъектНаСервере.ДеревоМетаданных;

	ТаблицаОтбора1 = РеквизитФормыВЗначение("ТаблицаОтбора");

	Отбор = Объект.Компоновщик.Настройки.Отбор;
	Отбор.Элементы.Очистить();

	Для Каждого Строка Из ТаблицаОтбора1 Цикл
		Если Строка.ИмяРеквизита = ТекущиеданныеИмя И Строка.ИмяОбъектаМетаданных = ИмяОбъектаМетаданных Тогда

			ВосстановитьОтборИзКэша(Отбор.Элементы, Строка.Отбор.Элементы, Строка.Отбор.ДоступныеПоляОтбора);

			//НовоеПоле  = Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
			//ЗаполнитьЗначенияСвойств(НовоеПоле, Строка.Отбор);
			//		
			//ОбъектНаСервере.Компоновщик.Настройки.Отбор.Элементы.Добавить(Строка.Отбор);
			//=Строка.Отбор;
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ОтборПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования)
		// Вставить содержимое обработчика.
	Если Не ОтменаРедактирования Тогда

		Выделить = ОбновитьТаблицуОтборанаСервере(Элементы.ДеревоМетаданных.ТекущиеДанные.ПолноеИмяМетаданных,
			Элементы.ДеревоМетаданных.ТекущиеДанные.ИмяОбъектаМетаданных);

		Если Выделить И Не Элементы.ДеревоМетаданных.ТекущиеДанные.Выделить Тогда
			ЭтаФорма.Элементы.ДеревоМетаданных.ТекущиеДанные.ИндексКартинки = ЭтаФорма.Элементы.ДеревоМетаданных.ТекущиеДанные.ИндексКартинки
				+ 1;
		ИначеЕсли Не (Выделить И Элементы.ДеревоМетаданных.ТекущиеДанные.Выделить) Тогда
			ЭтаФорма.Элементы.ДеревоМетаданных.ТекущиеДанные.ИндексКартинки = ЭтаФорма.Элементы.ДеревоМетаданных.ТекущиеДанные.ИндексКартинки
				- 1;
		КонецЕсли;

		Элементы.ДеревоМетаданных.ТекущиеДанные.Выделить = Выделить;

	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура ВосстановитьОтборИзКэша(ЭлементыОтбора, КэшОтбора, ОтборДоступныеПоляОтбора)

	Если КэшОтбора.Количество() > 0 Тогда

		Для Каждого ЭлементОтбора Из КэшОтбора Цикл

			Если ТипЗнч(ЭлементОтбора) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда

				НовоеПоле = ЭлементыОтбора.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
				ЗаполнитьЗначенияСвойств(НовоеПоле, ЭлементОтбора);
				ВосстановитьОтборИзКэша(НовоеПоле.Элементы, ЭлементОтбора.Элементы, ОтборДоступныеПоляОтбора);

			Иначе

				Если Объект.Компоновщик.Настройки.Отбор.ДоступныеПоляОтбора.НайтиПоле(ЭлементОтбора.ЛевоеЗначение)
					<> Неопределено Тогда

					НовоеПоле = ЭлементыОтбора.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
					ЗаполнитьЗначенияСвойств(НовоеПоле, ЭлементОтбора);

				КонецЕсли;

			КонецЕсли;

		КонецЦикла;

	КонецЕсли;

КонецПроцедуры

//@skip-warning
Процедура УстановитьДоступныеПоляДляОтбора(Отбор, ОтборДоступныеПоляОтбора)
КонецПроцедуры

&НаСервере
Функция ОбновитьТаблицуОтборанаСервере(ПолноеИмяМетаданных, ИмяОбъектаМетаданных)

	ОтборСсылка = Объект.Компоновщик.Настройки.Отбор;

	ТаблицаОтбора1 = РеквизитФормыВЗначение("ТаблицаОтбора");

	Колво = ТаблицаОтбора1.Количество();
	Пока Колво > 0 Цикл
		Строка = ТаблицаОтбора1[КолВо - 1];
		Если Строка.ИмяРеквизита = ПолноеИмяМетаданных И Строка.ИмяОбъектаМетаданных = ИмяОбъектаМетаданных Тогда
			ТаблицаОтбора1.Удалить(Строка);
		КонецЕсли;

		КолВо = КолВо - 1;
	КонецЦикла;

	Выделить = Ложь;

	//Найдено=Найти(ПолноеИмяМетаданных, "ИмяРеквизита");
	//
	//Если Найдено>0 Тогда
	//	НоваяСтрока=ТаблицаОтбора1[Найдено];
	//	НоваяСтрока.Отбор=ОтборСсылка;
	//Иначе
	Если ОтборСсылка.Элементы.Количество() > 0 Тогда
		НоваяСтрока = ТаблицаОтбора1.Добавить();
		НоваяСтрока.ИмяРеквизита = ПолноеИмяМетаданных;
		НоваяСтрока.ИмяОбъектаМетаданных = ИмяОбъектаМетаданных;

		ВосстановитьОтборИзКэша(НоваяСтрока.Отбор.Элементы, ОтборСсылка.Элементы, ОтборСсылка.ДоступныеПоляОтбора);
		УстановитьДоступныеПоляДляОтбора(НоваяСтрока.Отбор, ОтборСсылка.ДоступныеПоляОтбора);
		//НоваяСтрока.Отбор=ОтборСсылка;
		//КонецЕсли;
		Выделить = Истина;
	Иначе
		Выделить = Ложь;
	КонецЕсли;

	ЗначениеВРеквизитФормы(ТаблицаОтбора1, "ТаблицаОтбора");

	//ДеревоМетаданных1= РеквизитФормыВЗначение("Объект.ДеревоМетаданных");
	//ЗначениеВРеквизитФормы(ОбъектНаСервере.ДеревоМетаданных, "Объект.ДеревоМетаданных");
	//ДеревоМетаданных1 = ОбъектНаСервере.ДеревоМетаданных;
	Возврат Выделить;

КонецФункции

&НаКлиенте
Процедура ОтборПослеУдаления(Элемент)

	Выделить = ОбновитьТаблицуОтборанаСервере(Элементы.ДеревоМетаданных.ТекущиеДанные.ПолноеИмяМетаданных,
		Элементы.ДеревоМетаданных.ТекущиеДанные.ИмяОбъектаМетаданных);

	Если Выделить И Не Элементы.ДеревоМетаданных.ТекущиеДанные.Выделить Тогда
		ЭтаФорма.Элементы.ДеревоМетаданных.ТекущиеДанные.ИндексКартинки = ЭтаФорма.Элементы.ДеревоМетаданных.ТекущиеДанные.ИндексКартинки
			+ 1;
	ИначеЕсли Не (Выделить И Элементы.ДеревоМетаданных.ТекущиеДанные.Выделить) Тогда
		ЭтаФорма.Элементы.ДеревоМетаданных.ТекущиеДанные.ИндексКартинки = ЭтаФорма.Элементы.ДеревоМетаданных.ТекущиеДанные.ИндексКартинки
			- 1;
	КонецЕсли;

	Элементы.ДеревоМетаданных.ТекущиеДанные.Выделить = Выделить;

КонецПроцедуры

&НаСервере
Процедура УдалитьОтборНаСервере()
// Вставить содержимое обработчика.
	ТаблицаОтбора1 = РеквизитФормыВЗначение("ТаблицаОтбора");

	ТаблицаОтбора1.Очистить();

	ЗначениеВРеквизитФормы(ТаблицаОтбора1, "ТаблицаОтбора");

	Объект.Компоновщик.Настройки.Отбор.Элементы.Очистить();

	Дерево1 = Объект.ДеревоМетаданных.ПолучитьЭлементы();

	Для Каждого СтрокаРодитель Из Дерево1[0].ПолучитьЭлементы() Цикл
		Для Каждого ВетвьДерева Из СтрокаРодитель.ПолучитьЭлементы() Цикл
			Если ВетвьДерева.Выделить Тогда
				ВетвьДерева.ИндексКартинки = ВетвьДерева.ИндексКартинки - 1;
				ВетвьДерева.Выделить = Ложь;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура УдалитьОтбор(Команда)
	УдалитьОтборНаСервере();
КонецПроцедуры

&НаСервере
Процедура УдалитьПредопределенныеНаСервере()
// Вставить содержимое обработчика.
	Для Каждого Строка Из Метаданные.ПланыСчетов Цикл
		Запрос = Новый запрос;
		Запрос.Текст = "ВЫБРАТЬ
					   |	" + Строка.Имя + ".Ссылка КАК Ссылка
											 |ИЗ
											 |	ПланСчетов." + Строка.Имя + " КАК " + Строка.Имя + "
																									 |ГДЕ
																									 |	"
			+ Строка.Имя + ".Предопределенный";

		Выгрузка = Запрос.Выполнить().Выгрузить();

		КолВо = Выгрузка.Количество();

		Пока КолВо > 0 Цикл
			Объект1 = Выгрузка[КолВо - 1].Ссылка.ПолучитьОбъект();
			Если Объект1 <> Неопределено Тогда
				Попытка
					Объект1.ОбменДанными.Загрузка = Истина;
					Объект1.Удалить();
				Исключение
				КонецПопытки;
			КонецЕсли;
			КолВо = КолВо - 1;
		КонецЦикла;
	КонецЦикла;

	Для Каждого Строка Из Метаданные.Справочники Цикл
		Запрос = Новый запрос;
		Запрос.Текст = "ВЫБРАТЬ
					   |	" + Строка.Имя + ".Ссылка КАК Ссылка
											 |ИЗ
											 |	Справочник." + Строка.Имя + " КАК " + Строка.Имя + "
																									 |ГДЕ
																									 |	"
			+ Строка.Имя + ".Предопределенный";

		Выгрузка = Запрос.Выполнить().Выгрузить();

		КолВо = Выгрузка.Количество();

		Пока КолВо > 0 Цикл
			Объект1 = Выгрузка[КолВо - 1].Ссылка.ПолучитьОбъект();
			Если Объект1 <> Неопределено Тогда
				Попытка
					Объект1.ОбменДанными.Загрузка = Истина;
					Объект1.Удалить();
				Исключение
				КонецПопытки;
			КонецЕсли;
			КолВо = КолВо - 1;
		КонецЦикла;
	КонецЦикла;

	Для Каждого Строка Из Метаданные.ПланыВидовХарактеристик Цикл
		Запрос = Новый запрос;
		Запрос.Текст = "ВЫБРАТЬ
					   |	" + Строка.Имя + ".Ссылка КАК Ссылка
											 |ИЗ
											 |	ПланВидовХарактеристик." + Строка.Имя + " КАК " + Строка.Имя + "
																												 |ГДЕ
																												 |	"
			+ Строка.Имя + ".Предопределенный";

		Выгрузка = Запрос.Выполнить().Выгрузить();

		КолВо = Выгрузка.Количество();

		Пока КолВо > 0 Цикл
			Объект1 = Выгрузка[КолВо - 1].Ссылка.ПолучитьОбъект();
			Если Объект1 <> Неопределено Тогда
				Попытка
					Объект1.ОбменДанными.Загрузка = Истина;
					Объект1.Удалить();
				Исключение
				КонецПопытки;
			КонецЕсли;
			КолВо = КолВо - 1;
		КонецЦикла;
	КонецЦикла;

	Для Каждого Строка Из Метаданные.ПланыВидовРасчета Цикл
		Запрос = Новый запрос;
		Запрос.Текст = "ВЫБРАТЬ
					   |	" + Строка.Имя + ".Ссылка КАК Ссылка
											 |ИЗ
											 |	ПланВидовРасчета." + Строка.Имя + " КАК " + Строка.Имя + "
																										   |ГДЕ
																										   |	"
			+ Строка.Имя + ".Предопределенный";

		Выгрузка = Запрос.Выполнить().Выгрузить();

		КолВо = Выгрузка.Количество();

		Пока КолВо > 0 Цикл
			Объект1 = Выгрузка[КолВо - 1].Ссылка.ПолучитьОбъект();
			Если Объект1 <> Неопределено Тогда
				Попытка
					Объект1.ОбменДанными.Загрузка = Истина;
					Объект1.Удалить();
				Исключение
				КонецПопытки;
			КонецЕсли;
			КолВо = КолВо - 1;
		КонецЦикла;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура УдалитьПредопределенные(Команда)

	Режим = РежимДиалогаВопрос.ДаНет;
	Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияВопроса", ЭтотОбъект, Параметры);
	ПоказатьВопрос(Оповещение, НСтр("ru = 'Внимание! после удаления всех предопределенных элементов будет нарушена структура данных и   
									|Вы, возможно, не сможете зайти в программу снова (!) 
									|Вы готовы сразу после выполнения загрузить новые предопределенные элементы из файла ?
									|Продолжить выполнение операции?';" + " en = 'Warning! after the deleting predefined elements  structure of the data will be broken 
																		  |and you will not start the programm. Do you prepared to download the predefined elements from file ?
																		  |Do you want to continue?'"), Режим, 0);
		//...
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияВопроса(Результат, Параметры) Экспорт
	Если Результат = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;

	УдалитьПредопределенныеНаСервере();

	//...
КонецПроцедуры

&НаКлиенте
Процедура ОтметитьВыделенные(Команда)

	ВыделенныеСтроки = Элементы.ДеревоМетаданных.ВыделенныеСтроки;

	Если ВыделенныеСтроки.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Для Каждого Стр Из ВыделенныеСтроки Цикл
		Если ТипЗнч(Стр) = Тип("Число") Тогда
			ДанныеСтроки = Элементы.ДеревоМетаданных.ДанныеСтроки(Стр);
		Иначе
			ДанныеСтроки = Стр;
		КонецЕсли;
		//	
		ДанныеСтроки.Выгружать = Истина;
	КонецЦикла;
	//
	//		ЭтаФорма.ОбновитьОтображениеДанных(Элементы.ДеревоМетаданных);
КонецПроцедуры

&НаКлиенте
Процедура СнятьВыделенные(Команда)

	ВыделенныеСтроки = Элементы.ДеревоМетаданных.ВыделенныеСтроки;

	Если ВыделенныеСтроки.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;

	Для Каждого Стр Из ВыделенныеСтроки Цикл
		Если ТипЗнч(Стр) = Тип("Число") Тогда
			ДанныеСтроки = Элементы.ДеревоМетаданных.ДанныеСтроки(Стр);
		Иначе
			ДанныеСтроки = Стр;
		КонецЕсли;
		//	
		ДанныеСтроки.Выгружать = Ложь;
	КонецЦикла;
	//
	//		ЭтаФорма.ОбновитьОтображениеДанных(Элементы.ДеревоМетаданных);
КонецПроцедуры

//ЭтаФорма.Элементы.ДеревоМетаданных.ТекущиеДанные.ИндексКартинки=4;

#КонецОбласти